import os
from celery import Celery
from django.conf import settings

# 设置Django设置模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devops_backend.settings')

# 创建Celery应用
app = Celery('devops_backend')

# 使用Django设置配置Celery
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自动发现任务
app.autodiscover_tasks()

# Celery配置
app.conf.update(
    # 时区设置
    timezone='Asia/Shanghai',
    enable_utc=True,
    
    # 任务序列化
    task_serializer='json',
    accept_content=['json'],
    result_serializer='json',
    
    # 结果后端
    result_backend='redis://localhost:6379/1',
    
    # 任务路由
    task_routes={
        'monitoring.tasks.*': {'queue': 'monitoring'},
        'ssh_terminal.tasks.*': {'queue': 'ssh'},
    },
    
    # 任务超时
    task_soft_time_limit=300,  # 5分钟软超时
    task_time_limit=600,       # 10分钟硬超时
    
    # 工作进程配置
    worker_prefetch_multiplier=1,
    worker_max_tasks_per_child=1000,
    
    # 任务重试
    task_acks_late=True,
    task_reject_on_worker_lost=True,
    
    # 监控配置
    worker_send_task_events=True,
    task_send_sent_event=True,
)

# 定时任务配置
app.conf.beat_schedule = {
    # 主机监控任务 - 每30秒执行一次
    'collect-host-metrics': {
        'task': 'monitoring.tasks.collect_all_host_metrics',
        'schedule': 30.0,
        'options': {'queue': 'monitoring'}
    },
    
    # 进程信息收集 - 每分钟执行一次
    'collect-process-info': {
        'task': 'monitoring.tasks.collect_all_process_info',
        'schedule': 60.0,
        'options': {'queue': 'monitoring'}
    },
    
    # 服务状态检查 - 每2分钟执行一次
    'check-service-status': {
        'task': 'monitoring.tasks.check_all_service_status',
        'schedule': 120.0,
        'options': {'queue': 'monitoring'}
    },
    
    # 清理过期数据 - 每小时执行一次
    'cleanup-old-metrics': {
        'task': 'monitoring.tasks.cleanup_old_metrics',
        'schedule': 3600.0,
        'options': {'queue': 'monitoring'}
    },
    
    # 告警检查 - 每分钟执行一次
    'check-alerts': {
        'task': 'monitoring.tasks.check_alerts',
        'schedule': 60.0,
        'options': {'queue': 'monitoring'}
    },
    
    # 主机状态更新 - 每30秒执行一次
    'update-host-status': {
        'task': 'monitoring.tasks.update_host_status',
        'schedule': 30.0,
        'options': {'queue': 'monitoring'}
    },
}


@app.task(bind=True)
def debug_task(self):
    """调试任务"""
    print(f'Request: {self.request!r}')


# 任务失败处理
@app.task(bind=True)
def task_failure_handler(self, task_id, error, traceback):
    """任务失败处理器"""
    print(f'Task {task_id} failed: {error}')
    print(f'Traceback: {traceback}')


# 启动时的信号处理
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    """设置定时任务"""
    print("Celery periodic tasks configured")


# 工作进程准备就绪信号
@app.on_after_finalize.connect
def setup_worker_ready(sender, **kwargs):
    """工作进程准备就绪"""
    print("Celery worker is ready")
